/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import negocio.GestorPagosLocal;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
public class PagosBean {

    @EJB(beanName = "GestorPagosBean")
    private GestorPagosLocal gestorPagosBean;
    private int id;
    private int numero;
    private Date fecha;
    private BigDecimal monto;
    private String observaciones;
    private BigDecimal saldoCertificado;
    private int numeroCheque;
    private String tipoCheque;
    private String emisor;
    private String numeroCtaCorriente;
    private String banco;
    private int nroSucursal;
    private int idCertificado;
    private int numeroCertificado;
    private BigDecimal montoCertificado;
    private int idEstado;
    private String periodo;
    private int idObra;
    private int IdEmpresaContratista;
    private String nombreObra;
    private String nombreEmpresaContratista;
    private Date fehaMedicion;
    private Date fechaInicioObra;
    private Date fechaFinObra;
    private String codigoObra;
    private float montoObra;
    private String estadoObra;
    private String estado;
    private String fondos;
    private boolean mostrarAgregar = false;
    private boolean mostrarModificar = false;

    /**
     *
     */
    public PagosBean() {
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the numero
     */
    public int getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(int numero) {
        this.numero = numero;
    }

    /**
     * @return the fecha
     */
    public Date getFecha() {
        return fecha;
    }

    /**
     * @param fecha the fecha to set
     */
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    /**
     * @return the observaciones
     */
    public String getObservaciones() {
        return observaciones;
    }

    /**
     * @param observaciones the observaciones to set
     */
    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    /**
     * @return the idCertificado
     */
    public int getIdCertificado() {
        return idCertificado;
    }

    /**
     * @param idCertificado the idCertificado to set
     */
    public void setIdCertificado(int idCertificado) {
        this.idCertificado = idCertificado;
    }

    /**
     * @return the monto
     */
    public BigDecimal getMonto() {
        return monto;
    }

    /**
     * @param monto the monto to set
     */
    public void setMonto(BigDecimal monto) {
        this.monto = monto;
    }

    /**
     * @return the idObra
     */
    public int getIdObra() {
        return idObra;
    }

    /**
     * @param idObra the idObra to set
     */
    public void setIdObra(int idObra) {
        this.idObra = idObra;
    }

    /**
     * @return the IdEmpresaContratista
     */
    public int getIdEmpresaContratista() {
        return IdEmpresaContratista;
    }

    /**
     * @param IdEmpresaContratista the IdEmpresaContratista to set
     */
    public void setIdEmpresaContratista(int IdEmpresaContratista) {
        this.IdEmpresaContratista = IdEmpresaContratista;
    }

    /**
     * @return the nombreObra
     */
    public String getNombreObra() {
        return nombreObra;
    }

    /**
     * @param nombreObra the nombreObra to set
     */
    public void setNombreObra(String nombreObra) {
        this.nombreObra = nombreObra;
    }

    /**
     * @return the nombreEmpresaContratista
     */
    public String getNombreEmpresaContratista() {
        return nombreEmpresaContratista;
    }

    /**
     * @param nombreEmpresaContratista the nombreEmpresaContratista to set
     */
    public void setNombreEmpresaContratista(String nombreEmpresaContratista) {
        this.nombreEmpresaContratista = nombreEmpresaContratista;
    }

    /**
     * @return the fechaInicioObra
     */
    public Date getFechaInicioObra() {
        return fechaInicioObra;
    }

    /**
     * @param fechaInicioObra the fechaInicioObra to set
     */
    public void setFechaInicioObra(Date fechaInicioObra) {
        this.fechaInicioObra = fechaInicioObra;
    }

    /**
     * @return the fechaFinObra
     */
    public Date getFechaFinObra() {
        return fechaFinObra;
    }

    /**
     * @param fechaFinObra the fechaFinObra to set
     */
    public void setFechaFinObra(Date fechaFinObra) {
        this.fechaFinObra = fechaFinObra;
    }

    /**
     * @return the codigoObra
     */
    public String getCodigoObra() {
        return codigoObra;
    }

    /**
     * @param codigoObra the codigoObra to set
     */
    public void setCodigoObra(String codigoObra) {
        this.codigoObra = codigoObra;
    }

    /**
     * @return the montoObra
     */
    public float getMontoObra() {
        return montoObra;
    }

    /**
     * @param montoObra the montoObra to set
     */
    public void setMontoObra(float montoObra) {
        this.montoObra = montoObra;
    }

    /**
     * @return the estadoObra
     */
    public String getEstadoObra() {
        return estadoObra;
    }

    /**
     * @param estadoObra the estadoObra to set
     */
    public void setEstadoObra(String estadoObra) {
        this.estadoObra = estadoObra;
    }

    /**
     *
     * @param e
     */
    public void verCertificadosObraOyente(ActionEvent e) {
        UIParameter component = (UIParameter) e.getComponent().findComponent("idObraPago");
        this.setIdObra((Integer) Integer.parseInt(component.getValue().toString()));
        component = (UIParameter) e.getComponent().findComponent("idEmpresaPago");

        this.setIdEmpresaContratista((Integer) Integer.parseInt(component.getValue().toString()));
        component = (UIParameter) e.getComponent().findComponent("nombreObraPago");

        this.setNombreObra(component.getValue().toString());
        component = (UIParameter) e.getComponent().findComponent("nombreEmpresaPago");

        this.setNombreEmpresaContratista(component.getValue().toString());
        component = (UIParameter) e.getComponent().findComponent("fechaInicioObraPago");
        if (component.getValue() != null) {
            this.setFechaInicioObra((Date) component.getValue());
        } else {
            this.setFechaInicioObra(null);
        }
        component = (UIParameter) e.getComponent().findComponent("fechaFinObraPago");
        if (component.getValue() != null) {
            this.setFechaFinObra((Date) component.getValue());
        } else {
            this.setFechaFinObra(null);
        }
        component = (UIParameter) e.getComponent().findComponent("codigoObraPago");
        if (component.getValue() != null) {
            this.setCodigoObra(component.getValue().toString());
        } else {
            this.setCodigoObra("");
        }
        component = (UIParameter) e.getComponent().findComponent("montoObraPago");
        if (component.getValue() != null) {
            this.setMontoObra(Float.parseFloat(component.getValue().toString()));
        } else {
            this.setMontoObra(0.0f);
        }
        component = (UIParameter) e.getComponent().findComponent("estadoObraPago");
        if (component.getValue() != null) {
            this.setEstadoObra(component.getValue().toString());
        } else {
            this.setEstadoObra("");
        }

    }

//****************** TODAVIA NO HACE NADA **************//
    /**
     *
     * @param e
     */
    public void verPagosCertificadosOyente(ActionEvent e) {
        UIParameter ui = (UIParameter) e.getComponent().findComponent("idCertificadoConsulta");
        this.setIdCertificado((Integer) Integer.parseInt(ui.getValue().toString()));

//    ui = (UIParameter) e.getComponent().findComponent("numero");
//    this.setNumeroCertificado(Integer.parseInt(ui.getValue().toString()));
//
//    ui = (UIParameter) e.getComponent().findComponent("fecha");
//    this.setFecha((Date) ui.getValue());
//
//    ui = (UIParameter) e.getComponent().findComponent("numeroCheque");
//    this.setNumeroCheque((Integer) Integer.parseInt(ui.getValue().toString()));
//
//    ui = (UIParameter) e.getComponent().findComponent("tipoCheque");
//    this.setTipoCheque(ui.getValue().toString());
//
//    ui = (UIParameter) e.getComponent().findComponent("monto");
//    this.setMonto((Float) Float.parseFloat(ui.getValue().toString()));
//
//    ui=(UIParameter) e.getComponent().findComponent("emisor");
//    this.setEmisor(ui.getValue().toString());
//
//     ui = (UIParameter) e.getComponent().findComponent("numeroCtaCorriente");
//    this.setNumeroCtaCorriente(ui.getValue().toString());
//
//    ui = (UIParameter) e.getComponent().findComponent("banco");
//    this.setBanco(ui.getValue().toString());


    }

    /**
     *
     * @param e
     */
    public void pagarCertificadoOyente(ActionEvent e) {
        this.mostrarAgregar = true;
        this.mostrarModificar = false;

        UIParameter componente = (UIParameter) e.getComponent().findComponent("idPagar");
        this.setIdCertificado((Integer) Integer.parseInt(componente.getValue().toString()));

//componente = (UIParameter) e.getComponent().findComponent("idCert");
//this.setIdCertificado(Integer.parseInt(componente.getValue().toString()));

        componente = (UIParameter) e.getComponent().findComponent("numeroCert");
        this.setNumeroCertificado(Integer.parseInt(componente.getValue().toString()));

        componente = (UIParameter) e.getComponent().findComponent("periodoCert");
        this.setPeriodo(componente.getValue().toString());

        componente = (UIParameter) e.getComponent().findComponent("fechaMedicion");
        this.setFehaMedicion((Date) componente.getValue());

        componente = (UIParameter) e.getComponent().findComponent("montoCert");
        this.setMontoCertificado(new BigDecimal(componente.getValue().toString()));

        componente = (UIParameter) e.getComponent().findComponent("fondosCert");
        this.setFondos(componente.getValue().toString());

        componente = (UIParameter) e.getComponent().findComponent("estadoCert");
        this.setEstado(componente.getValue().toString());

        this.setNumero(0);
        this.setMonto(new BigDecimal("0.0"));
        this.setObservaciones("");
        this.setFecha(null);

        this.setNumeroCheque(0);
        this.setTipoCheque("");
        this.setEmisor("");
        this.setNumeroCtaCorriente("");
        this.setBanco("");
        this.setNroSucursal(0);

    }

    /**
     *
     * @return
     */
    public List getCertificadosObra() {

//      ACA ME DEBE MOSTRAR TODAS AQUELLOS CERTIFICADS CUYO ESTADO SEA <> DE "PAGADO"

        List<datos.Certificado> pagos = this.gestorPagosBean.verCertificadosObra(this.idObra);
        return pagos;
    }

    /**
     *
     * @return
     */
    public List getPagosCertificadosObra() {
        return this.gestorPagosBean.existePago(this.idCertificado);
    }

    /**
     *
     * @return
     */
    public BigDecimal getCalcularSaldo() {
        List<datos.Pago> existe = this.gestorPagosBean.existePago(this.idCertificado);

        if (!existe.isEmpty()) {
            //if (existe != null) {
            BigDecimal saldo = new BigDecimal("0.00");
            BigDecimal totalPagos = new BigDecimal("0.00");
            BigDecimal montoTotalCertificado = new BigDecimal("0.00");
            int i = 0;
            for (datos.Pago p : existe) {
                if (i == 0) {
                    totalPagos = totalPagos.add(p.getMonto());
                    montoTotalCertificado = p.getIdCertificado().getMonto();
                    if (montoTotalCertificado.compareTo(BigDecimal.ZERO)!=0) {
                        saldo = montoTotalCertificado.subtract(totalPagos);
                        this.setSaldoCertificado(saldo);
                    }
                    if (saldo.compareTo(BigDecimal.ZERO)==0) {
                        saldo = new BigDecimal("0.00");
                        this.setSaldoCertificado(saldo);
                    }

                } else {
                    totalPagos = totalPagos.add(p.getMonto());
                    montoTotalCertificado = p.getIdCertificado().getMonto();
                    if (montoTotalCertificado.compareTo(BigDecimal.ZERO)!=0) {
                        saldo = montoTotalCertificado.subtract(totalPagos);
                        this.setSaldoCertificado(saldo);
                    }
                    if (saldo.compareTo(BigDecimal.ZERO)==0) {
                        saldo = new BigDecimal("0.00");//OJO!!
                        this.setSaldoCertificado(saldo);
                    }

                }
                i++;
            }
            return this.getSaldoCertificado();

        } else {
            this.setSaldoCertificado(montoCertificado);
            return this.getMontoCertificado();
        }


    }

    /**
     *
     * @return
     */
    public String guardarPago() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (this.getMonto().compareTo(this.getSaldoCertificado()) <= -1 && this.getMonto().compareTo(BigDecimal.ZERO) != 0) {
            boolean guardado = this.gestorPagosBean.agregarPago(numero, fecha, observaciones, monto, montoCertificado, idCertificado, idEstado, estado, saldoCertificado, numeroCheque, tipoCheque, emisor, numeroCtaCorriente, banco, nroSucursal);
            this.mostrarAgregar = false;
            // this.mostrarModificar = false;
            if (guardado == true) {
                context.addMessage(null, new FacesMessage("Pago guardado con exito", ""));

            } else {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "El Pago no pudo ser guardado con exito", ""));
            }
        } else {
            this.setMonto(new BigDecimal("0.00"));
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "El monto del pago es incorrecto, por favor ingreselo nuevamente", ""));
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void cancelarOyente(ActionEvent e) {
        // this.mostrarModificar = false;
        this.mostrarAgregar = false;
        this.setNumero(0);
        this.setMonto(new BigDecimal("0.0"));
        this.setFecha(null);
        this.setObservaciones("");

        this.setNumeroCertificado(0);
        this.setMontoCertificado(new BigDecimal("0.0"));
        this.setPeriodo("");
        this.setFehaMedicion(null);
        this.setSaldoCertificado(new BigDecimal("0.0"));

        this.setNumeroCheque(0);
        this.setTipoCheque("");
        this.setEmisor("");
        this.setNumeroCtaCorriente("");
        this.setBanco("");
        this.setNroSucursal(0);

    }

    /**
     * @return the mostrarAgregar
     */
    public boolean isMostrarAgregar() {
        return mostrarAgregar;
    }

    /**
     * @param mostrarAgregar the mostrarAgregar to set
     */
    public void setMostrarAgregar(boolean mostrarAgregar) {
        this.mostrarAgregar = mostrarAgregar;
    }

    /**
     * @return the mostrarModificar
     */
    public boolean isMostrarModificar() {
        return mostrarModificar;
    }

    /**
     * @param mostrarModificar the mostrarModificar to set
     */
    public void setMostrarModificar(boolean mostrarModificar) {
        this.mostrarModificar = mostrarModificar;
    }

    /**
     * @return the periodo
     */
    public String getPeriodo() {
        return periodo;
    }

    /**
     * @param periodo the periodo to set
     */
    public void setPeriodo(String periodo) {
        this.periodo = periodo;
    }

    /**
     * @return the fehaMedicion
     */
    public Date getFehaMedicion() {
        return fehaMedicion;
    }

    /**
     * @param fehaMedicion the fehaMedicion to set
     */
    public void setFehaMedicion(Date fehaMedicion) {
        this.fehaMedicion = fehaMedicion;
    }

    /**
     * @return the estado
     */
    public String getEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(String estado) {
        this.estado = estado;
    }

    /**
     * @return the fondos
     */
    public String getFondos() {
        return fondos;
    }

    /**
     * @param fondos the fondos to set
     */
    public void setFondos(String fondos) {
        this.fondos = fondos;
    }

    /**
     * @return the idEstado
     */
    public int getIdEstado() {
        return idEstado;
    }

    /**
     * @param idEstado the idEstado to set
     */
    public void setIdEstado(int idEstado) {
        this.idEstado = idEstado;
    }

    /**
     * @return the montoCertificado
     */
    public BigDecimal getMontoCertificado() {
        return montoCertificado;
    }

    /**
     * @param montoCertificado the montoCertificado to set
     */
    public void setMontoCertificado(BigDecimal montoCertificado) {
        this.montoCertificado = montoCertificado;
    }

    /**
     * @return the numeroCertificado
     */
    public int getNumeroCertificado() {
        return numeroCertificado;
    }

    /**
     * @param numeroCertificado the numeroCertificado to set
     */
    public void setNumeroCertificado(int numeroCertificado) {
        this.numeroCertificado = numeroCertificado;
    }

    /**
     * @return the saldoCertificado
     */
    public BigDecimal getSaldoCertificado() {
        return saldoCertificado;
    }

    /**
     * @param saldoCertificado the saldoCertificado to set
     */
    public void setSaldoCertificado(BigDecimal saldoCertificado) {
        this.saldoCertificado = saldoCertificado;
    }

    /**
     * @return the numeroCheque
     */
    public int getNumeroCheque() {
        return numeroCheque;
    }

    /**
     * @param numeroCheque the numeroCheque to set
     */
    public void setNumeroCheque(int numeroCheque) {
        this.numeroCheque = numeroCheque;
    }

    /**
     * @return the tipoCheque
     */
    public String getTipoCheque() {
        return tipoCheque;
    }

    /**
     * @param tipoCheque the tipoCheque to set
     */
    public void setTipoCheque(String tipoCheque) {
        this.tipoCheque = tipoCheque;
    }

    /**
     * @return the emisor
     */
    public String getEmisor() {
        return emisor;
    }

    /**
     * @param emisor the emisor to set
     */
    public void setEmisor(String emisor) {
        this.emisor = emisor;
    }

    /**
     * @return the numeroCtaCorriente
     */
    public String getNumeroCtaCorriente() {
        return numeroCtaCorriente;
    }

    /**
     * @param numeroCtaCorriente the numeroCtaCorriente to set
     */
    public void setNumeroCtaCorriente(String numeroCtaCorriente) {
        this.numeroCtaCorriente = numeroCtaCorriente;
    }

    /**
     * @return the banco
     */
    public String getBanco() {
        return banco;
    }

    /**
     * @param banco the banco to set
     */
    public void setBanco(String banco) {
        this.banco = banco;
    }

    /**
     * @return the nroSucursal
     */
    public int getNroSucursal() {
        return nroSucursal;
    }

    /**
     * @param nroSucursal the nroSucursal to set
     */
    public void setNroSucursal(int nroSucursal) {
        this.nroSucursal = nroSucursal;
    }
}